package com.dkm.ec.sale.service.impl;


import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.annotation.EnableLoadTimeWeaving;
import org.springframework.stereotype.Service;

import com.dkm.biz.gl.constants.GlConfigStatus;
import com.dkm.biz.gl.persistence.entity.GlDicPo;
import com.dkm.biz.gl.repository.GlDicRepository;
import com.dkm.ec.constants.SaleStatConstants;
import com.dkm.ec.sale.domain.SaleEntityStat;
import com.dkm.ec.sale.persistence.entity.SaleEntityStatPo;
import com.dkm.ec.sale.repository.SaleEntityStatRepository;
import com.dkm.ec.sale.service.SaleSkuStatService;
@Service
public class SaleSkuStatServiceImpl implements SaleSkuStatService {
	
	@Resource
	private SaleEntityStatRepository saleEntityStatRepository;
	
	@Resource
	private GlDicRepository glDicRepository;
	
	@Override
	public synchronized void addProductStat(String prodId, String type,int changeCount,BigDecimal saleTotal) {
		SaleEntityStatPo saleEntityStatPo=saleEntityStatRepository.getByProdId(prodId);
		SaleEntityStat saleEntityStat=null;
		if(saleEntityStatPo==null ){
			saleEntityStat=saleEntityStatRepository.newInstance();
			saleEntityStatPo=saleEntityStat.getData();
			saleEntityStatPo.setEvalQty(0);
			saleEntityStatPo.setEvalQtyReal(0);
			saleEntityStatPo.setSaleQty(0);
			saleEntityStatPo.setSaleQtyReal(0);
			saleEntityStatPo.setFavQty(0);
			saleEntityStatPo.setFavQtyReal(0);
			saleEntityStatPo.setProdId(prodId);
			saleEntityStatPo.setSkuId("");
			saleEntityStatPo.setSalesTotal(new BigDecimal(0));
			saleEntityStatPo.setOrderCount(0);
			saleEntityStatPo.setGoodReviewQty(0);
			saleEntityStatPo.setMiddleReviewQty(0);
			saleEntityStatPo.setMistakeReviewQty(0);
			saleEntityStatPo.setType(SaleEntityStatPo.TYPE.SALE);
		}else{
			saleEntityStat=saleEntityStatRepository.load(saleEntityStatPo.getId());
		}
		
		if (SaleStatConstants.TYPE_REVIEW.equals(type)) {
			if(saleEntityStatPo.getEvalQty()==null){
				saleEntityStatPo.setEvalQty(0);
			}
			if(saleEntityStatPo.getEvalQtyReal()==null){
				saleEntityStatPo.setEvalQtyReal(0);
			}
			saleEntityStatPo.setEvalQty(saleEntityStatPo.getEvalQty()+changeCount);
			saleEntityStatPo.setEvalQtyReal(saleEntityStatPo.getEvalQtyReal()+changeCount);
		} else if (SaleStatConstants.TYPE_SALE.equals(type)) {
			if(saleEntityStatPo.getSaleQty()==null){
				saleEntityStatPo.setSaleQty(0);
			}
			if(saleEntityStatPo.getSaleQtyReal()==null){
				saleEntityStatPo.setSaleQtyReal(0);
			}
			saleEntityStatPo.setSaleQty(saleEntityStatPo.getSaleQty()+changeCount);
			saleEntityStatPo.setSaleQtyReal(saleEntityStatPo.getSaleQtyReal()+changeCount);
		}else if (SaleStatConstants.TYPE_SALE_SUBDUCTION.equals(type)) {
			if(saleEntityStatPo.getSaleQty()==null){
				saleEntityStatPo.setSaleQty(0);
			}
			if(saleEntityStatPo.getSaleQtyReal()==null){
				saleEntityStatPo.setSaleQtyReal(0);
			}
		//	saleEntityStatPo.setSaleQty(saleEntityStatPo.getSaleQty()+changeCount);
			saleEntityStatPo.setSaleQtyReal(saleEntityStatPo.getSaleQtyReal()-changeCount);
		}else if (SaleStatConstants.TYPE_FAVORITE.equals(type)) {
			if(saleEntityStatPo.getFavQty()==null){
				saleEntityStatPo.setFavQty(0);
			}
			if(saleEntityStatPo.getFavQtyReal()==null){
				saleEntityStatPo.setFavQtyReal(0);
			}
			saleEntityStatPo.setFavQty(saleEntityStatPo.getFavQty()+changeCount);
			saleEntityStatPo.setFavQtyReal(saleEntityStatPo.getFavQtyReal()+changeCount);
		}else if (SaleStatConstants.SALE_TOTAL.equals(type)) {
			if(saleEntityStatPo.getSalesTotal() == null){
				saleEntityStatPo.setSalesTotal(new BigDecimal(0));
			}
			BigDecimal bigDecimal = saleEntityStatPo.getSalesTotal().add(saleTotal);
			DecimalFormat df1 = new DecimalFormat("0.00");  
			saleEntityStatPo.setSalesTotal(new BigDecimal(df1.format(bigDecimal)));
		}else if (SaleStatConstants.SALE_TOTAL_SUBDUCTION.equals(type)) {
			if(saleEntityStatPo.getSalesTotal() == null){
				saleEntityStatPo.setSalesTotal(new BigDecimal(0));
			}
			BigDecimal bigDecimal = saleEntityStatPo.getSalesTotal().subtract(saleTotal);
			DecimalFormat df1 = new DecimalFormat("0.00");  
			saleEntityStatPo.setSalesTotal(new BigDecimal(df1.format(bigDecimal)));
		}else if (SaleStatConstants.ORDER_COUNT.equals(type)) {
			if(saleEntityStatPo.getOrderCount() == null){
				saleEntityStatPo.setOrderCount(0);
			}
			saleEntityStatPo.setOrderCount(saleEntityStatPo.getOrderCount()+changeCount);
		}else if (SaleStatConstants.GOOD_REVIEW_QTY.equals(type)) {
			if(saleEntityStatPo.getGoodReviewQty() == null){
				saleEntityStatPo.setGoodReviewQty(0);
			}
			saleEntityStatPo.setGoodReviewQty(saleEntityStatPo.getGoodReviewQty()+changeCount);
		}else if (SaleStatConstants.MIDDLE_REVIEW_QTY.equals(type)) {
			if(saleEntityStatPo.getMiddleReviewQty() == null){
				saleEntityStatPo.setMiddleReviewQty(0);
			}
			saleEntityStatPo.setMiddleReviewQty(saleEntityStatPo.getMiddleReviewQty()+changeCount);
		}else if (SaleStatConstants.MISTAKE_REVIEW_QTY.equals(type)) {
			if(saleEntityStatPo.getMistakeReviewQty() == null){
				saleEntityStatPo.setMistakeReviewQty(0);
			}
			saleEntityStatPo.setMistakeReviewQty(saleEntityStatPo.getMistakeReviewQty()+changeCount);
		}
		saleEntityStat.setData(saleEntityStatPo);
		saleEntityStat.save();
	}

	@Override
	public synchronized void addSkuStat(String prodId,String skuId,String type, int changeCount,BigDecimal saleTotal) {
		SaleEntityStatPo saleEntityStatPo=saleEntityStatRepository.getBySkuId(skuId);
		SaleEntityStat saleEntityStat=null;
		if(saleEntityStatPo==null ){
			saleEntityStat=saleEntityStatRepository.newInstance();
			saleEntityStatPo=saleEntityStat.getData();
			saleEntityStatPo.setEvalQty(0);
			saleEntityStatPo.setEvalQtyReal(0);
			saleEntityStatPo.setSaleQty(0);
			saleEntityStatPo.setSaleQtyReal(0);
			saleEntityStatPo.setFavQty(0);
			saleEntityStatPo.setFavQtyReal(0);
			saleEntityStatPo.setProdId(prodId);
			saleEntityStatPo.setSkuId(skuId);
			saleEntityStatPo.setSalesTotal(new BigDecimal(0));
			saleEntityStatPo.setOrderCount(0);
			saleEntityStatPo.setGoodReviewQty(0);
			saleEntityStatPo.setMiddleReviewQty(0);
			saleEntityStatPo.setMistakeReviewQty(0);
			saleEntityStatPo.setType(SaleEntityStatPo.TYPE.SKU);
		}else{
			saleEntityStat=saleEntityStatRepository.load(saleEntityStatPo.getId());
		}
		
		if (SaleStatConstants.TYPE_REVIEW.equals(type)) {
			if(saleEntityStatPo.getEvalQty()==null){
				saleEntityStatPo.setEvalQty(0);
			}
			if(saleEntityStatPo.getEvalQtyReal()==null){
				saleEntityStatPo.setEvalQtyReal(0);
			}
			saleEntityStatPo.setEvalQty(saleEntityStatPo.getEvalQty()+changeCount);
			saleEntityStatPo.setEvalQtyReal(saleEntityStatPo.getEvalQtyReal()+changeCount);
		} else if (SaleStatConstants.TYPE_SALE.equals(type)) {
			if(saleEntityStatPo.getSaleQty()==null){
				saleEntityStatPo.setSaleQty(0);
			}
			if(saleEntityStatPo.getSaleQtyReal()==null){
				saleEntityStatPo.setSaleQtyReal(0);
			}
			saleEntityStatPo.setSaleQty(saleEntityStatPo.getSaleQty()+changeCount);
			saleEntityStatPo.setSaleQtyReal(saleEntityStatPo.getSaleQtyReal()+changeCount);
		} else if (SaleStatConstants.TYPE_FAVORITE.equals(type)) {
			if(saleEntityStatPo.getFavQty()==null){
				saleEntityStatPo.setFavQty(0);
			}
			if(saleEntityStatPo.getFavQtyReal()==null){
				saleEntityStatPo.setFavQtyReal(0);
			}
			saleEntityStatPo.setFavQty(saleEntityStatPo.getFavQty()+changeCount);
			saleEntityStatPo.setFavQtyReal(saleEntityStatPo.getFavQtyReal()+changeCount);
		}else if (SaleStatConstants.SALE_TOTAL.equals(type)) {
			if(saleEntityStatPo.getSalesTotal() == null){
				saleEntityStatPo.setSalesTotal(new BigDecimal(0));
			}
			BigDecimal bigDecimal = saleEntityStatPo.getSalesTotal().add(saleTotal);
			DecimalFormat df1 = new DecimalFormat("0.00");  
			saleEntityStatPo.setSalesTotal(new BigDecimal(df1.format(bigDecimal)));
		}else if (SaleStatConstants.ORDER_COUNT.equals(type)) {
			if(saleEntityStatPo.getOrderCount() == null){
				saleEntityStatPo.setOrderCount(0);
			}
			saleEntityStatPo.setOrderCount(saleEntityStatPo.getOrderCount()+changeCount);
		}else if (SaleStatConstants.GOOD_REVIEW_QTY.equals(type)) {
			if(saleEntityStatPo.getGoodReviewQty() == null){
				saleEntityStatPo.setGoodReviewQty(0);
			}
			saleEntityStatPo.setGoodReviewQty(saleEntityStatPo.getGoodReviewQty()+changeCount);
		}else if (SaleStatConstants.MIDDLE_REVIEW_QTY.equals(type)) {
			if(saleEntityStatPo.getMiddleReviewQty() == null){
				saleEntityStatPo.setMiddleReviewQty(0);
			}
			saleEntityStatPo.setMiddleReviewQty(saleEntityStatPo.getMiddleReviewQty()+changeCount);
		}else if (SaleStatConstants.MISTAKE_REVIEW_QTY.equals(type)) {
			if(saleEntityStatPo.getMistakeReviewQty() == null){
				saleEntityStatPo.setMistakeReviewQty(0);
			}
			saleEntityStatPo.setMistakeReviewQty(saleEntityStatPo.getMistakeReviewQty()+changeCount);
		}else if (SaleStatConstants.TYPE_SALE_SUBDUCTION.equals(type)) {
			if(saleEntityStatPo.getSaleQty()==null){
				saleEntityStatPo.setSaleQty(0);
			}
			if(saleEntityStatPo.getSaleQtyReal()==null){
				saleEntityStatPo.setSaleQtyReal(0);
			}
		//	saleEntityStatPo.setSaleQty(saleEntityStatPo.getSaleQty()+changeCount);
			saleEntityStatPo.setSaleQtyReal(saleEntityStatPo.getSaleQtyReal()-changeCount);
		}else if (SaleStatConstants.SALE_TOTAL_SUBDUCTION.equals(type)) {
			if(saleEntityStatPo.getSalesTotal() == null){
				saleEntityStatPo.setSalesTotal(new BigDecimal(0));
			}
			BigDecimal bigDecimal = saleEntityStatPo.getSalesTotal().subtract(saleTotal);
			DecimalFormat df1 = new DecimalFormat("0.00");  
			saleEntityStatPo.setSalesTotal(new BigDecimal(df1.format(bigDecimal)));
		}
		saleEntityStat.setData(saleEntityStatPo);
		saleEntityStat.save();

	}

	@Override
	public void upgradeSalesLevel(String prodId, String skuId) {
		List<GlDicPo> glDicPos= glDicRepository.findByCateKey(GlConfigStatus.KEY_SALESLEVEL);
		if(glDicPos==null || glDicPos.size()==0){
			return;
		}
		//TODO 暂不做产品SKU更新
		//SaleEntityStatPo saleEntityStatPo=saleEntityStatRepository.getBySkuId(skuId);
		SaleEntityStatPo saleEntityStatPo=saleEntityStatRepository.getByProdId(prodId);
		if(saleEntityStatPo==null){
			return;
		}
		try{
			int saleQty=saleEntityStatPo.getSaleQty();
			String evalSalesLevel=saleEntityStatPo.getEvalSalesLevel();
			int saleQtyReal=saleEntityStatPo.getSaleQtyReal();
			String salesLevel=saleEntityStatPo.getSalesLevel();
			boolean saleQtyFlag=false;
			boolean saleQtyRealFlag=false;
			boolean flag=false;   //是否需要修改保存
			List<GlDicPo> dicPos=order(glDicPos);
			for(GlDicPo dicPo:dicPos){
				int value=Integer.valueOf(dicPo.getValue());
				if(!saleQtyFlag){
					if(saleQty>=value ){
						saleQtyFlag=true;    //下次不需要再比较
						if(!dicPo.getLabel().equals(evalSalesLevel)){
							saleEntityStatPo.setEvalSalesLevel(dicPo.getLabel());
							flag=true;   
						}
					}
				}
				if(!saleQtyRealFlag){
					if(saleQtyReal>=value ){
						saleQtyRealFlag=true;  //下次不需要再比较
						if(!dicPo.getLabel().equals(salesLevel)){
							saleEntityStatPo.setSalesLevel(dicPo.getLabel());
							flag=true;
						}
					}
				}
				if(saleQtyFlag && saleQtyRealFlag){
					break;
				}
			}
			if(flag){
				SaleEntityStat saleEntityStat=saleEntityStatRepository.load(saleEntityStatPo.getId());
				saleEntityStat.setData(saleEntityStatPo);
				saleEntityStat.save();
			}
			
		}catch (Exception e) {
			e.printStackTrace();
			
		}
		
		
	}

	private List<GlDicPo> order(List<GlDicPo> glDicPos) {
		List<GlDicPo> pos=new ArrayList<GlDicPo>();
			for(int i=0;i<glDicPos.size()-1;){
				GlDicPo maxPo=glDicPos.get(i);
				for(int j=1;j<glDicPos.size();j++){
					GlDicPo minPo=glDicPos.get(j);
					int max=Integer.valueOf(maxPo.getValue());
					int min=Integer.valueOf(minPo.getValue());
					if(max<min){
						maxPo=minPo;
					}
					if (j==glDicPos.size()-1) {
						pos.add(maxPo);
						glDicPos.remove(maxPo);
					}
				}
			}
			if(glDicPos.size()>0){
				pos.add(glDicPos.get(0));
			}
			return pos;
	}

}
